package model

import (
	j_log "config-client-v1/init/j-log"
	"config-client-v1/utils/tools"
	"errors"
)

// VarRecord 变量历史表
type VarRecord struct {
	ID         int64   `gorm:"column:id;primaryKey;autoIncrement:true" json:"id"`
	ProjectID  int     `gorm:"column:project_id" json:"project_id"`   // 工程ID
	Addr       string  `gorm:"column:addr" json:"addr"`               // 变量地址
	FieldName  string  `gorm:"column:field_name" json:"field_name"`   // 变量名
	SpecType   string  `gorm:"column:spec_type" json:"spec_type"`     // 具体类型 float32,float64,uint8,uint16,uint32,uint64
	Value      float64 `gorm:"column:value" json:"value"`             // 变量值(字符串显示,用时转换)
	CreateTime *string `gorm:"column:create_time" json:"create_time"` // 创建时间
}

func (*VarRecord) TableName() string {
	return "var_record"
}

// VarAlert 报警记录表
// 判断逻辑:
// 有超上上限报警时, 判断内存中是否存在 map[base_addr:alert_type_id], 不存在则在内存中记录当前 map[base_addr:alert_type_id], 数据库也存储一份, 且推送给前端
// 存在不做任何操作
// 有超上限报警时
type VarAlert struct {
	ID            int64   `gorm:"column:id;primaryKey;autoIncrement:true" json:"id"`
	ProjectID     int     `gorm:"column:project_id" json:"project_id"`           // 工程ID
	Alert         string  `gorm:"column:alert" json:"alert"`                     // 报警信息
	Const         string  `gorm:"column:const" json:"const"`                     // 报警常量标识
	T1            string  `gorm:"column:t1" json:"t1"`                           //
	T2            string  `gorm:"column:t2" json:"t2"`                           //
	Detail        string  `gorm:"column:detail" json:"detail"`                   // 报警详情
	BaseAddr      string  `gorm:"column:base_addr" json:"base_addr"`             // 基础变量地址
	BaseFieldName string  `gorm:"column:base_field_name" json:"base_field_name"` // 基础变量名
	IsRead        uint8   `gorm:"column:is_read" json:"is_read"`                 // 0.未读 1.已读
	Audio         string  `gorm:"-" json:"audio"`                                // 报警音频mp3
	AudioShield   uint8   `gorm:"column:audio_shield" json:"audio_shield"`       // 屏蔽/播放
	IsRecovery    uint8   `gorm:"column:is_recovery" json:"is_recovery"`         // 是否恢复
	RecoveryTime  *string `gorm:"column:recovery_time" json:"recovery_time"`     // 恢复时间
	CreateTime    *string `gorm:"column:create_time" json:"create_time"`         // 创建时间
}

type SysAlert struct {
	ID         int64   `gorm:"column:id;primaryKey;autoIncrement:true" json:"id"`
	ProjectID  int     `gorm:"column:project_id" json:"project_id"`   // 工程ID
	Alert      string  `gorm:"column:alert" json:"alert"`             // 报警信息
	Const      string  `gorm:"column:const" json:"const"`             // 报警常量标识
	RelationID int     `gorm:"column:relation_id" json:"relation_id"` // 报警关联ID (ppe_id, fs_id... )
	T1         string  `gorm:"column:t1" json:"t1"`                   //
	T2         string  `gorm:"column:t2" json:"t2"`                   //
	Detail     string  `gorm:"column:detail" json:"detail"`           // 报警详情
	IsRead     uint8   `gorm:"column:is_read" json:"is_read"`         // 0.未读 1.已读
	CreateTime *string `gorm:"column:create_time" json:"create_time"` // 创建时间
}

func (*VarAlert) TableName() string {
	return "var_alert"
}

func (*SysAlert) TableName() string {
	return "sys_alert"
}

type AlertTypeDefault struct {
	ID         int     `gorm:"column:id;primaryKey;autoIncrement:true" json:"id"`
	Const      string  `gorm:"column:const" json:"const"`             // 报警常量标识
	T1         string  `gorm:"column:t1" json:"t1"`                   // 报警类型1 [过程值报警,系统报警]
	T2         string  `gorm:"column:t2" json:"t2"`                   // 报警类型2 [模拟量报警,布尔量报警,系统其他报警]
	Level      string  `gorm:"column:level" json:"level"`             // 报警级别 [告警,提示,记录]
	Audio      string  `gorm:"column:audio" json:"audio"`             // 报警声音文件名称; /static/src/audio/audio1.mp3
	Color      string  `gorm:"column:color" json:"color"`             // 报警颜色方案
	Desc       string  `gorm:"column:desc" json:"desc"`               // 报警描述
	CreateTime *string `gorm:"column:create_time" json:"create_time"` // 创建时间
	UpdateTime *string `gorm:"column:update_time" json:"update_time"` // 修改时间
}

func (*AlertTypeDefault) TableName() string {
	return "alert_type_default"
}

// AlertType 报警类型表 (报警处理逻辑表, 播放声音还是颜色方案)
type AlertType struct {
	ID         int     `gorm:"column:id;primaryKey;autoIncrement:true" json:"id"`
	ProjectID  int     `gorm:"column:project_id" json:"project_id"`
	Const      string  `gorm:"column:const" json:"const"`             // 报警常量标识
	T1         string  `gorm:"column:t1" json:"t1"`                   // 报警类型1 [过程值报警,系统报警]
	T2         string  `gorm:"column:t2" json:"t2"`                   // 报警类型2 [模拟量报警,布尔量报警,系统其他报警]
	Level      string  `gorm:"column:level" json:"level"`             // 报警级别 [告警,提示,记录]
	Audio      string  `gorm:"column:audio" json:"audio"`             // 报警声音文件名称; /static/src/audio/audio1.mp3
	Color      string  `gorm:"column:color" json:"color"`             // 报警颜色方案
	Desc       string  `gorm:"column:desc" json:"desc"`               // 报警描述
	CreateTime *string `gorm:"column:create_time" json:"create_time"` // 创建时间
	UpdateTime *string `gorm:"column:update_time" json:"update_time"` // 修改时间
}

func (*AlertType) TableName() string {
	return "alert_type"
}

func (at *AlertType) Exists(id int) (exist bool, err error) {
	err = DB.Where("id = ?", id).Limit(1).Find(at).Error
	if err != nil {
		return
	}
	if at.ID == 0 {
		return
	}
	exist = true
	return
}
func (at *AlertType) CheckParam(mode string) (err error) {
	switch at.Level {
	case "告警":
	case "提示":
	case "记录":
	default:
		return errors.New("参数level错误")
	}
	return
}

func AlertTypeNameMap() (m map[int]string) {
	m = make(map[int]string)
	list := make([]*AlertType, 0)
	_ = DB.Where("1 = 1").Limit(5000).Find(&list).Error
	for _, row := range list {
		m[row.ID] = row.T1
	}
	return
}

func SysAlertSave(data *SysAlert) (err error) {
	now := tools.GetNow()
	data.T1 = "系统报警"
	data.T2 = "设备通讯异常"
	data.CreateTime = &now
	err = DB.Create(data).Error
	if err != nil {
		j_log.LogWarning([]interface{}{"SysAlertSave error", err})
		return
	}
	return
}
